package com.sc.nft.service.impl;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sc.nft.dao.MallBillFinancialAuditDao;
import com.sc.nft.entity.MallBillFinancialAudit;
import com.sc.nft.entity.dto.MallBillFinancialAuditPageDTO;
import com.sc.nft.entity.vo.AuditBillFinancialAuditVO;
import com.sc.nft.entity.vo.AuditBillVO;
import com.sc.nft.entity.vo.MallBillFinancialAuditVO;
import com.sc.nft.enums.AuditMallBillStatusEnum;
import com.sc.nft.enums.MallBillFinancialAuditStatusEnum;
import com.sc.nft.exception.GlobalRunTimeException;
import com.sc.nft.service.MallBillFinancialAuditService;
import com.sc.nft.service.MallBillService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.Objects;

/**
 * <p>
 * 商城账单财务审核 服务实现类
 * </p>
 *
 * @author ligen
 * @since 2024-01-17
 */
@Slf4j
@RequiredArgsConstructor
@Service
public class MallBillFinancialAuditServiceImpl implements MallBillFinancialAuditService {

    private final MallBillFinancialAuditDao mallBillFinancialAuditDao;
    private final MallBillService mallBillService;

    /**
     * 账单财务审核列表
     *
     * @param mallBillFinancialAuditVO
     * @return
     */
    @Override
    public Page<MallBillFinancialAuditPageDTO> getMallBillFinancialAuditPageDTO(MallBillFinancialAuditVO mallBillFinancialAuditVO) {
        Page<MallBillFinancialAuditPageDTO> mallBillFinancialAuditPageDTO = mallBillFinancialAuditDao.getMallBillFinancialAuditPageDTO(mallBillFinancialAuditVO.getPageNo(), mallBillFinancialAuditVO.getPageSize(), mallBillFinancialAuditVO.getDaoId(), mallBillFinancialAuditVO.getStartTime(),
                mallBillFinancialAuditVO.getEndTime(), mallBillFinancialAuditVO.getSettlementNo(), mallBillFinancialAuditVO.getStatus());
        if (Objects.nonNull(mallBillFinancialAuditPageDTO) && !CollectionUtils.isEmpty(mallBillFinancialAuditPageDTO.getRecords())) {
            mallBillFinancialAuditPageDTO.getRecords().forEach(e->{
                if (!StringUtils.isEmpty(e.getFiles())) {
                    e.setAuditFiles(StrUtil.split(e.getFiles(),","));
                }
            });
        }
        return mallBillFinancialAuditPageDTO;
    }

    /**
     * 财务审核
     *
     * @param auditBillFinancialAuditVO
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void audit(AuditBillFinancialAuditVO auditBillFinancialAuditVO) {
        MallBillFinancialAudit mallBillFinancialAudit = getById(auditBillFinancialAuditVO.getId());
        if (Objects.isNull(mallBillFinancialAudit)) {
            throw new GlobalRunTimeException("财务审核单不存在");
        }
        if (MallBillFinancialAuditStatusEnum.FINANCIAL_AUDIT != mallBillFinancialAudit.getStatus()) {
            throw new GlobalRunTimeException("该财务审核单已处理");
        }
        mallBillFinancialAudit.setStatus(auditBillFinancialAuditVO.getStatus());
        mallBillFinancialAudit.setRemark(auditBillFinancialAuditVO.getRemark());
        if (!CollectionUtils.isEmpty(auditBillFinancialAuditVO.getAuditFiles())) {
            mallBillFinancialAudit.setAuditFiles(StrUtil.join(",",auditBillFinancialAuditVO.getAuditFiles()));
        }
        mallBillFinancialAudit.updateById();
        AuditBillVO auditBillVO = new AuditBillVO();
        auditBillVO.setId(mallBillFinancialAudit.getBillId());
        auditBillVO.setRemark(auditBillFinancialAuditVO.getRemark());
        if (MallBillFinancialAuditStatusEnum.PASS == auditBillFinancialAuditVO.getStatus()) {
            // 通过
            auditBillVO.setStatus(AuditMallBillStatusEnum.DONE);
        } else if (MallBillFinancialAuditStatusEnum.REJECT == auditBillFinancialAuditVO.getStatus()) {
            // 拒绝
            auditBillVO.setStatus(AuditMallBillStatusEnum.FINANCIAL_REJECTION);
        } else if (MallBillFinancialAuditStatusEnum.SEND_BACK == auditBillFinancialAuditVO.getStatus()) {
            // 退回
            auditBillVO.setStatus(AuditMallBillStatusEnum.FINANCIAL_RETURN);
        }
        mallBillService.audit(auditBillVO);
    }

    @Override
    public MallBillFinancialAudit getById(Long id) {
        return mallBillFinancialAuditDao.getById(id);
    }
}
